home *** CD-ROM | disk | FTP | other *** search
/ Amiga Format CD 7 / Amiga Format AFCD07 (Dec 1996, Issue 91).iso / in_the_mag / blitz / listing.doc
Text File  |  1996-09-16  |  11KB  |  843 lines

  1.  
  2.  
  3. ;
  4. ;
  5. ; HTML viewer v0.9
  6. ;
  7. ; (C) 1996 John Kennedy for Amiga Format
  8. ;
  9. ;
  10.  
  11.  
  12. ; Define Constants
  13.  
  14.  
  15. #screen_height=256    ; Assume a 512 by 256 screen
  16. #limitx=560           ; How far across the screen text can go...
  17. #limit_height=1200    ; Limit to size of screen to attempt
  18.  
  19.  
  20.  
  21. ; Define list
  22.  
  23. NEWTYPE .linktype
  24.   x1.q
  25.   y1.q
  26.   x2.q
  27.   y2.q
  28.   address$
  29. End NEWTYPE
  30.  
  31. Dim List hyperlinks.linktype(100)
  32.  
  33.  
  34. NEWTYPE .picturetype
  35.   height.q
  36.   width.q
  37.   name$
  38.   align$
  39. End NEWTYPE
  40.  
  41. Dim List pictures.picturetype(50)
  42.  
  43.  
  44.  
  45.  
  46. ; Rest of program...
  47.  
  48.  
  49. Statement alert{t$,a$,b$,c$,d$}
  50.  
  51.   ; This procedure puts up a box
  52.   WTitle t$,t$
  53.  
  54.   Window 1,100,100,300,100,$1002,t$,1,2
  55.   Use Window 1    ; Use the new window for i/o
  56.   NPrint ""
  57.   NPrint a$
  58.   NPrint b$
  59.   NPrint c$
  60.   NPrint d$
  61.   NPrint " * Click to continue *"
  62.   MouseWait       ; Wait for a mouse click
  63.   Free Window 1   ; Shut the about window
  64.   Use Window 0    ; Return to main window!
  65. End Statement
  66.  
  67.  
  68.  
  69.  
  70.  
  71. Function load{p$}
  72.  
  73.   SHARED html$
  74.   SHARED count
  75.   html$=""
  76.  
  77.   WTitle "Loading..","Loading.."
  78.  
  79.   MaxLen path$=192
  80.   MaxLen name$=192
  81.  
  82.  
  83.   path$="blitz2:af"
  84.   pattern$="(#?html||#?htm)"
  85.  
  86.   If p$=""
  87.  
  88.     p$=ASLFileRequest$("HTML File to load",path$,name$,pattern$)
  89.  
  90.  
  91.   EndIf
  92.  
  93.   count=0
  94.  
  95.   flag=ReadFile(0,p$)
  96.  
  97.   If flag=True
  98.  
  99.     FileInput 0
  100.     While NOT Eof(0)
  101.       html$=html$+Inkey$(1)
  102.       count=count+1
  103.     Wend
  104.  
  105.   Else
  106.  
  107.     alert{"File Error"," Sorry, the File you requested"," could not be loaded.", " Please try again",""}
  108.     Function Return False
  109.  
  110.  
  111.  
  112.   EndIf
  113.  
  114.   Function Return True
  115.  
  116.  
  117.  
  118.   End Function
  119.  
  120.  
  121.  
  122.  
  123.  
  124.  
  125. ; Start of Program!
  126. ; -----------------
  127.  
  128.  
  129. ; Open a screen
  130. Screen 0,12,"Blitz Browser"
  131.  
  132. height=screen_height
  133.  
  134. Gosub open_display
  135.  
  136.  
  137.  
  138. WLocate 10,10
  139. Print "Welcome to Blitz Browser"
  140.  
  141.  
  142.  
  143. Repeat
  144.  
  145.  
  146.   WTitle "Waiting","Waiting"
  147.  
  148.  
  149.   Select WaitEvent
  150.  
  151.     Case $100   ; Menu operation
  152.  
  153.       Select ItemHit
  154.  
  155.         Case 0; The Load option
  156.         If load{""}=True Then Gosub process
  157.  
  158.  
  159.         Case 1; The Save option
  160.         ; Some day
  161.  
  162.         Case 2; The About option
  163.         alert{"About"," ","HTML Viewer","Early alpha"," "}
  164.  
  165.         Case 3; The Quit option
  166.         Goto goodbye
  167.  
  168.       End Select
  169.  
  170.  
  171.     Case $200   ; Close gadget selected
  172.       Goto goodbye
  173.  
  174.     Case $40    ; Scroll bar clicked
  175.         y.w=VPropPot(0,1)*height
  176.         PositionSuperBitMap 0,y.w
  177.         Redraw 0,1
  178.  
  179.     Case $8 ; Mouse button
  180.         Gosub click
  181.  
  182.  
  183.   End Select
  184.  
  185. Forever
  186.  
  187.  
  188.  
  189.  
  190.  
  191.  
  192.  
  193.  
  194.  
  195.  
  196.  
  197.  
  198. .process
  199.  
  200.  
  201. WTitle "Processing HTML","Processing HTML"
  202.  
  203. WCls
  204. Redraw 0,1
  205. preview=On    ; Nothing is printed, at first
  206.  
  207.  
  208. ResetList hyperlinks()
  209.  
  210.  
  211.  
  212. For scan=1 To 2
  213.  
  214.   ResetList pictures()
  215.  
  216.  
  217.  
  218.   WColour 1
  219.   bold=Off
  220.   underline=Off
  221.   italic=Off
  222.   size=3
  223.   oldsize=3
  224.   original=3
  225.   offset=0
  226.   Gosub use_font
  227.   chunk$=""
  228.   startx=8
  229.   starty=8
  230.  
  231.   xpos=startx
  232.   ypos=starty
  233.   sizey=13
  234.  
  235.  
  236.  
  237.   WLocate xpos,ypos
  238.  
  239.   lflag=Off
  240.   letter=1
  241.   tag=False
  242.   value=False
  243.   t$=""
  244.   v$=""
  245.   lnk$=""
  246.  
  247.   While letter<count
  248.     l$=Mid$(html$,letter,1)
  249.       If Asc(l$)=10 l$=" "
  250.       If tag=True
  251.         If l$=">" Gosub process_tag:l$="":tag=False
  252.        t$=t$+l$
  253.       Else
  254.         If l$="<" tag=True:t$="":l$=""
  255.         If (l$<>"" AND value=True) v$=v$+l$
  256.         If (l$<>"" AND value=False) Then Gosub process_text
  257.      EndIf
  258.     letter=letter+1
  259.   Wend
  260.  
  261.   If preview=On
  262.  
  263.     ; Close existing screen and re-open one the right size
  264.     CloseWindow 0
  265.     height=ypos
  266.     If height<#screen_height Then height=#screen_height
  267.     If height>#limit_height Then height=#screen_height
  268.     Gosub open_display
  269.   End If
  270.  
  271.  
  272.   preview=Off
  273.  
  274.   Next scan
  275.  
  276. Return
  277.  
  278.  
  279.  
  280.  
  281.  
  282.  
  283.  
  284.  
  285.  
  286.  
  287. .flush_text
  288.   If preview=Off Print chunk$:offset=WCursX
  289.   chunk$=""
  290. Return
  291.  
  292.  
  293.  
  294.  
  295. .process_text
  296.  
  297. chunk$=chunk$+l$
  298.  
  299.  
  300. If (offset+(Len(chunk$)*sizex))>#limitx OR ((offset+(Len(chunk$)*sizex))>(#limitx-120) AND l$=" ")
  301.  
  302.     If preview=Off Print chunk$
  303.     If preview=On
  304.       t$="Height:"+Str$(ypos)
  305.      WTitle t$,t$
  306.     End If
  307.  
  308.     Gosub line_break
  309.     chunk$=""
  310. EndIf
  311.  
  312. Return
  313.  
  314.  
  315.  
  316. .process_tag
  317.  
  318.   t$=LCase$(t$)
  319.   t$=StripTrail$(t$,32)
  320.   t$=StripLead$(t$,32)
  321.  
  322.   Select t$
  323.         Case "br"
  324.           Gosub flush_text
  325.           Gosub line_break
  326.         Case "p"
  327.           Gosub flush_text
  328.           Gosub new_paragraph
  329.         Case "hr"
  330.           Gosub flush_text
  331.           Gosub horizontal_line
  332.         Case "/b"
  333.           bold=Off:Gosub flush_text:Gosub use_font
  334.         Case "/u"
  335.           underlined=Off:Gosub flush_text:Gosub use_font
  336.         Case "/i"
  337.           italic=Off:Gosub flush_text:Gosub use_font
  338.         Case "b"
  339.           bold=On:Gosub flush_text:Gosub use_font
  340.         Case "u"
  341.           underlined=On:Gosub flush_text:Gosub use_font
  342.         Case "i"
  343.           italic=On:Gosub flush_text:Gosub use_font
  344.         Case "h1"
  345.           size=1:Gosub flush_text:Gosub use_font
  346.         Case "h2"
  347.           size=2:Gosub flush_text:Gosub use_font
  348.         Case "h3"
  349.           size=3:Gosub flush_text:Gosub use_font
  350.         Case "h4"
  351.           size=4:Gosub flush_text:Gosub use_font
  352.         Case "h5"
  353.           size=5:Gosub flush_text:Gosub use_font
  354.         Case "h6"
  355.           size=6:Gosub flush_text:Gosub use_font
  356.         Case "/h1"
  357.           size=0:Gosub flush_text:Gosub use_font:Gosub new_paragraph
  358.         Case "/h2"
  359.           size=0:Gosub flush_text:Gosub use_font:Gosub new_paragraph
  360.         Case "/h3"
  361.           size=0:Gosub flush_text:Gosub use_font:Gosub new_paragraph
  362.         Case "/h4"
  363.           size=0:Gosub flush_text:Gosub use_font:Gosub new_paragraph
  364.         Case "/h5"
  365.           size=0:Gosub flush_text:Gosub use_font:Gosub new_paragraph
  366.         Case "/h6"
  367.           size=0:Gosub flush_text:Gosub use_font:Gosub new_paragraph
  368.  
  369.  
  370.  
  371.         Case "title"  ; start capturing title
  372.           value=True:v$=""
  373.  
  374.         Case "/title" ; title captured
  375.           If value=True
  376.             Gosub print_title:value=False
  377.           EndIf
  378.  
  379.         Case "/a" ; link captured
  380.             If value=True AND preview=Off
  381.               Gosub make_link:value=False
  382.             EndIf
  383.  
  384.  
  385.  
  386.   End Select
  387.  
  388.         ; Now tests for more fiddly commands
  389.  
  390.         ; Found the definition of a link
  391.  
  392.         If preview=Off
  393.           If Left$(t$,2)="a " ; t$= is the entire tag link!
  394.  
  395.             ; process t$ to be only the link
  396.  
  397.             f$=Chr$(34)
  398.             a=Instr(t$,f$)
  399.             t$=UnRight$(t$,a)
  400.             t$=StripTrail$(t$,34)
  401.  
  402.             value=True:v$=""
  403.             lflag=On  ; just to make sure tags are not nested
  404.             AddItem hyperlinks()
  405.             USEPATH hyperlinks()
  406.             \address=t$
  407.             \x1=WCursX
  408.             \y1=WCursY
  409.           EndIf
  410.         EndIf
  411.  
  412.  
  413.         If Left$(t$,3)="img"
  414.           Gosub picture
  415.         EndIf
  416.  
  417.  
  418. Return
  419.  
  420.  
  421.  
  422.  
  423.  
  424.  
  425. .click
  426.  
  427. ; test to see if there is a link under the pointer
  428. ; when the user clicks the left mouse button
  429.  
  430.  
  431. x=WMouseX
  432. y=WMouseY+VPropPot(0,1)*height
  433. ResetList hyperlinks()
  434. l$=""
  435. While (NextItem(hyperlinks()) AND l$="")
  436. USEPATH hyperlinks()
  437.   If (x>=\x1 AND x<=\x2) AND (y>=\y1 AND y<=\y2)
  438.     l$=\address
  439.   EndIf
  440. Wend
  441.  
  442. ;If l$<>"" Then NPrint "The link is ",l$
  443.  
  444. If l$<>"" Then If load{l$}=True Then Gosub process
  445.  
  446.  
  447.  
  448.  
  449. Return
  450.  
  451.  
  452.  
  453.  
  454.  
  455.  
  456.  
  457.  
  458.  
  459. ;
  460. ; HTML COMMANDS
  461. ;
  462.  
  463.  
  464.  
  465. .horizontal_line
  466.  
  467.  
  468. If preview=Off
  469.   y=WCursY
  470.   w=InnerWidth
  471.   WLine 8,y,(w-32),y,1
  472.   WLine 8,y+1,(w-32),y+1,2
  473. EndIf
  474.  
  475. Gosub new_paragraph
  476. Return
  477.  
  478.  
  479.  
  480.  
  481.  
  482. .picture
  483. Gosub flush_text
  484. Gosub new_paragraph
  485.  
  486.  
  487. If preview=On
  488.  
  489. ; Get details of picture (i.e. height)
  490. ; and add it to a list.
  491.  
  492.  
  493.  
  494.  
  495.   ; Obtain filename from string
  496.  
  497.   f$=Chr$(34)
  498.   a=Instr(t$,f$)
  499.   t$=UnRight$(t$,a)
  500.   a=Instr(t$,f$)
  501.   s$=Mid$(t$,a+1,Len(t$)-a)
  502.   t$=Left$(t$,a-1)
  503.  
  504.   ; Determine alignment (if any)
  505.  
  506.   CaseSense Off
  507.   a$=""
  508.   If Instr(s$,"left")<>0 Then a$="L"
  509.   If Instr(s$,"center")<>0 Then a$="M"
  510.   If Instr(s$,"right")<>0 Then a$="R"
  511.  
  512.  
  513.  
  514.   ; Get info from file....
  515.  
  516.   If Exists(t$)
  517.  
  518.  
  519.     ILBMInfo t$
  520.  
  521.  
  522.     If AddItem (pictures())
  523.       USEPATH pictures()
  524.         \height=ILBMHeight
  525.         \width=ILBMWidth
  526.         \name=t$
  527.         \align=a$
  528.     EndIf
  529.  
  530.  
  531.   Else
  532.  
  533.  
  534.       If AddItem (pictures())
  535.       USEPATH pictures()
  536.         \height=16
  537.         \width=16
  538.         \name="broken"
  539.         \align=a$
  540.        EndIf
  541.  
  542.   EndIf
  543.  
  544.   xpos=startx
  545.   ypos=ypos+h-sizey-sizey
  546.   WLocate xpos,ypos
  547.   offset=0
  548.  
  549.  
  550.  
  551. EndIf
  552.  
  553.  
  554.  
  555.  
  556. If preview=Off
  557.  
  558.  
  559.   a=NextItem(pictures())
  560.  
  561.  
  562.   USEPATH pictures()
  563.     n$=\name
  564.     a$=\align
  565.     w=\width
  566.     h=\height
  567.  
  568.  
  569.   If n$="broken"
  570.  
  571.  
  572.     y=WCursY
  573.     x=WCursX
  574.     WBox x,y,x+16,y+16,2
  575.     WLine x,y,x+16,y+16,1
  576.     WLine x,y+16,x+16,y,1
  577.  
  578.   Else
  579.  
  580.  
  581.   ; Load in image as a "shape"
  582.  
  583.   LoadShape 0,n$
  584.  
  585.   ; Place shape in main bitmap
  586.  
  587.  
  588.   y=WCursY
  589.   x=WCursX
  590.  
  591.   WBlit 0,x,y
  592.  
  593.   End If
  594.  
  595.   xpos=startx
  596.   ypos=ypos+h-sizey-sizey
  597.   WLocate xpos,ypos
  598.   offset=0
  599.  
  600. End If
  601.  
  602. Gosub new_paragraph
  603. Return
  604.  
  605.  
  606.  
  607.  
  608. .print_title
  609. v$=StripTrail$(v$,32)
  610. v$=StripLead$(v$,32)
  611. WTitle v$,v$
  612. Return
  613.  
  614.  
  615.  
  616.  
  617.  
  618. .make_link
  619.  
  620.  
  621.  
  622.   If preview=Off
  623.  
  624.  
  625.   Gosub flush_text
  626.   Gosub special_flush
  627.  
  628.  
  629.     USEPATH hyperlinks()
  630.     \x2=WCursX
  631.     \y2=WCursY+sizey
  632.  
  633.   End If
  634.  
  635.   ;WBox \x1,\y1,\x2,\y2,2  ; Used for testing...
  636.  
  637. Return
  638.  
  639.  
  640. .special_flush
  641.  
  642. WColour 2         ; Switch to new colour for links
  643.  
  644. For a=1 To Len(v$)
  645.  
  646.   Print Mid$(v$,a,1)
  647.  
  648.   If WCursX>(#limitx-128)
  649.  
  650.  
  651.   ; At this point the text has wrapped, but
  652.   ; a link is still in the middle of being
  653.   ; defined. Our strategy is to pretend it
  654.   ; has finished, and then start it again.
  655.  
  656.  
  657.     ; Finish current link
  658.     USEPATH hyperlinks()
  659.     t$=\address            ; remember this for the next link
  660.     \x2=WCursX
  661.     \y2=WCursY+sizey
  662.  
  663.     ; Take a new line
  664.     Gosub line_break
  665.  
  666.     ; Add a new link
  667.     AddItem hyperlinks()
  668.     USEPATH hyperlinks()
  669.     \address=t$            ; feed the link back in again
  670.     \x1=WCursX
  671.     \y1=WCursY
  672.  
  673.   EndIf
  674.  
  675. Next a
  676.  
  677. WColour 1         ; Return colour to default
  678.  
  679. Return
  680.  
  681.  
  682.  
  683. ;
  684. ; Text positions
  685. ;
  686.  
  687. .line_break
  688.   xpos=startx
  689.   ypos=ypos+sizey
  690.   WLocate xpos,ypos
  691.   offset=0
  692.   ;If preview=Off Gosub check_wrap
  693.  
  694. Return
  695.  
  696. .new_paragraph
  697.   xpos=startx
  698.   ypos=ypos+sizey+sizey
  699.   WLocate xpos,ypos
  700.   offset=0
  701. Return
  702.  
  703.  
  704.  
  705.  
  706.  
  707.  
  708.  
  709.  
  710.  
  711.  
  712.  
  713.  
  714.  
  715.  
  716. ; FONT Routines
  717.  
  718. .use_font
  719.  
  720. ; Control the font used, depending on size and attributes
  721.  
  722.     style.b=0
  723.     If underlined=On style=style+1
  724.     If bold=On style=style+2
  725.     If italic=On style=style+4
  726.     WindowFont size,style
  727.  
  728.  
  729. ; Alter how much space a newline takes up, depending
  730. ; on the size of the font used.
  731.  
  732.     Select size
  733.     Case 0
  734.       sizey=13
  735.       sizex=5
  736.     Case 1
  737.       sizey=28
  738.       sizex=12
  739.     Case 2
  740.       sizey=24
  741.       sizex=10
  742.     Case 3
  743.       sizey=18
  744.       sizex=7
  745.     Case 4
  746.       sizey=15
  747.       sizex=6
  748.     Case 5
  749.       sizey=13
  750.       sizex=5
  751.     Case 6
  752.       sizey=11
  753.       sizex=4
  754.  
  755.  
  756.     End Select
  757.  
  758.     If italic=On sizex=sizex+1
  759.     If bold=On sizex=sizex+2
  760.  
  761.  
  762. ;
  763.  
  764.  
  765. Return
  766.  
  767.  
  768.  
  769.  
  770.  
  771.  
  772.  
  773. .prepare_fonts
  774.  
  775. f$="times.font"
  776.  
  777. LoadFont 6,f$,11
  778. LoadFont 5,f$,13
  779. LoadFont 4,f$,15
  780. LoadFont 3,f$,18
  781. LoadFont 2,f$,24
  782. LoadFont 1,f$,28
  783. LoadFont 0,"helvetica.font",13
  784.  
  785. Return
  786.  
  787.  
  788.  
  789.  
  790. .open_display
  791.  
  792. ;
  793. ; Define and open a Screen and Window
  794. ;
  795.  
  796. ; Define a BitMap
  797. BitMap 0,640,height+#screen_height,4
  798.  
  799. ; The display is 4 deep, i.e. 16 colours!
  800.  
  801.  
  802. ; Define menus
  803.  
  804. MenuTitle 0,0,"Project"
  805. MenuItem 0,0,0,0,"Load       ","L"
  806. MenuItem 0,0,0,1,"Save       ","S"
  807. MenuItem 0,0,0,2,"About      "
  808. MenuItem 0,0,0,3,"Quit       ","Q"
  809.  
  810. ; Define Gadgets
  811.  
  812. PropGadget 0,-16,0,128+2+1024,1,16,244
  813.  
  814. ; Open a Special Window
  815.  
  816. Window 0,0,0,640,256,$0+$0+$20000+$20+$8+$400+$80+$1000,"SuperWindow",1,2,0,0
  817.  
  818. SetMenu 0
  819.  
  820. SetVProp 0,1,0,(10/height)
  821. Redraw 0,1
  822.  
  823.  
  824. Gosub prepare_fonts
  825.  
  826. WindowFont 0
  827.  
  828. Return
  829.  
  830.  
  831.  
  832.  
  833. .goodbye
  834.   CloseWindow 0
  835.   CloseScreen 0
  836. End
  837.  
  838.  
  839.  
  840.  
  841.  
  842.  
  843.